package br.com.iss.transporteCia.model;

import java.util.Date;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;

public class CrudUtil {
	public static void salvar(Object objeto) throws HibernateException {
		Session sessao = null;
		try {
			sessao = HibernateUtil.getSessionFactory().openSession();
			sessao.getTransaction().begin();
			sessao.save(objeto);
			sessao.getTransaction().commit();
		} finally {
			sessao.close();
		}
	}

	public static void atualizar(Object objeto) throws HibernateException {
		Session sessao = null;
		try {
			sessao = HibernateUtil.getSessionFactory().openSession();
			sessao.getTransaction().begin();
			sessao.update(objeto);
			sessao.getTransaction().commit();
		} finally {
			sessao.close();
		}
	}

	public static void excluir(Object objeto) throws HibernateException {
		Session sessao = null;
		try {
			sessao = HibernateUtil.getSessionFactory().openSession();
			sessao.getTransaction().begin();
			sessao.delete(objeto);
			sessao.getTransaction().commit();
		} finally {
			sessao.close();
		}
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public static List<Object> listar(String classe) throws HibernateException {
		Session sessao = null;
		try {
			sessao = HibernateUtil.getSessionFactory().openSession(); //aqui
			sessao.getTransaction().begin();

			String hql = "FROM " + classe;
			org.hibernate.Query query = sessao.createQuery(hql);
			List resultado = query.list();
			return resultado;
		} finally {
			sessao.close();
		}
	}

	@SuppressWarnings("rawtypes")
	public static Object buscar(String tabela, String campo, Long parametro) throws HibernateException {
		Session sessao = null;
		try {
			sessao = HibernateUtil.getSessionFactory().openSession();
			sessao.getTransaction().begin();

			String hql = "FROM " + tabela + " E WHERE E." + campo
					+ " = :pUsuario";
			org.hibernate.Query query = sessao.createQuery(hql);
			query.setParameter("pUsuario", parametro);
			List resultado = query.list();
			return resultado;
		} finally {
			sessao.close();
		}
	}
	
	@SuppressWarnings("rawtypes")
	public static Object buscaUsuarioPorNome(String nomeDoUsuario) throws HibernateException {
		Session sessao = null;
		try {
			sessao = HibernateUtil.getSessionFactory().openSession();
			sessao.getTransaction().begin();

			String hql = "FROM br.com.iss.transporteCia.model.Usuario E WHERE E.usuario = :pUsuario";
			org.hibernate.Query query = sessao.createQuery(hql);
			query.setParameter("pUsuario", nomeDoUsuario);
			List resultado = query.list();
			return resultado;
		} finally {
			sessao.close();
		}
	}

	@SuppressWarnings("rawtypes")
	public static Object buscar(String tabela, String campo, Integer parametro) throws HibernateException {
		Session sessao = null;
		try {
			sessao = HibernateUtil.getSessionFactory().openSession();
			sessao.getTransaction().begin();

			String hql = "FROM " + tabela + " E WHERE E." + campo
					+ " = :pUsuario";
			org.hibernate.Query query = sessao.createQuery(hql);
			query.setParameter("pUsuario", parametro);
			List resultado = query.list();
			return resultado;
		} finally {
			sessao.close();
		}
	}
	
	@SuppressWarnings("rawtypes")
	public static Object buscar(String tabela, String campo, String parametro) throws HibernateException {
		Session sessao = null;
		try {
			sessao = HibernateUtil.getSessionFactory().openSession();
			sessao.getTransaction().begin();

			String hql = "FROM " + tabela + " E WHERE E." + campo
					+ " = :pUsuario";
			org.hibernate.Query query = sessao.createQuery(hql);
			query.setParameter("pUsuario", parametro);
			List resultado = query.list();
			return resultado;
		} finally {
			sessao.close();
		}
	}
	
	@SuppressWarnings("rawtypes")
	public static Object buscarFreteLancadoNoMesmoPeriodo(Date pDataHoraChegadaFrete, Date pDataHoraSaidaFrete, Frota pFrota) throws HibernateException {
		Session sessao = null;
		try {
			sessao = HibernateUtil.getSessionFactory().openSession();
			sessao.getTransaction().begin();

			String hql = "FROM br.com.iss.transporteCia.model.Frete E"
					+ " WHERE E.dataHoraSaida BETWEEN :pDataHoraSaidaFrete AND :pDataHoraChegadaFrete"
					+ " OR E.dataHoraChegada BETWEEN :pDataHoraSaidaFrete AND :pDataHoraChegadaFrete"
					+ " OR E.dataHoraChegada > :pDataHoraChegadaFrete AND E.dataHoraSaida < :pDataHoraSaidaFrete"
					+ " AND E.frota = :pFrota";
			org.hibernate.Query query = sessao.createQuery(hql);
			query.setParameter("pDataHoraSaidaFrete", pDataHoraSaidaFrete);
			query.setParameter("pDataHoraChegadaFrete", pDataHoraChegadaFrete);
			query.setParameter("pFrota", pFrota);
			List resultado = query.list();
			return resultado;
		} finally {
			sessao.close();
		}
	}
        
        @SuppressWarnings("rawtypes")
		public static Object buscarVeiculoParaFrota() throws HibernateException {
			Session sessao = null;
			try {
				sessao = HibernateUtil.getSessionFactory().openSession();
				sessao.getTransaction().begin();
				
				String hql = "FROM br.com.iss.transporteCia.model.Veiculo V"						
						+ "WHERE V.veiculo_id NOT IN ( "
						+ 	"SELECT V.veiculo_id  FROM iss2013.veiculo V, iss2013.frota F"
						+	"WHERE F.placatracao_id = V.veiculo_id"
						+	"AND F.frota_status = 'ativa' "
						+ ")";
				
				org.hibernate.Query query = sessao.createQuery(hql);
				List resultado = query.list();
				return resultado;
				
			} finally {
				sessao.close();
			}
		}

	
	@SuppressWarnings("rawtypes")
	public static Object logar(String pUsuario, String pSenha) throws HibernateException {
		Session sessao = null;
		try {
			sessao = HibernateUtil.getSessionFactory().openSession();
			sessao.getTransaction().begin();

			String hql = "FROM br.com.iss.transporteCia.model.Usuario E"
					+ " WHERE E.usuario = :pUsuario"
					+ " AND E.senha = :pSenha";
			org.hibernate.Query query = sessao.createQuery(hql);
			query.setParameter("pUsuario", pUsuario);
			query.setParameter("pSenha", pSenha);
			List resultado = query.list();
			return resultado;
		} finally {
			sessao.close();
		}
	}
}
